package Reflect02;

import Reflect.Student;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;

/*
反射获取成员变量并使用

void set(Object odj,Object value):给obj对象的成员变量赋值为value

 */
public class ReflectDemo02 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        //获取class对象
        Class c = Class.forName("Reflect.Student");
        Field[] declaredFields = c.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println(declaredField);
        }
        Field name = c.getDeclaredField("name");
        name.setAccessible(true);
        Student s = new Student();
        name.set(s ,"李艺彤");
        System.out.println(s);
        //Field[] getFields() 返回包含一个数组 Field对象反射由此表示的类或接口的所有可访问的公共字段 类对象
        //public Field[] getDeclaredFields()返回的数组Field对象反映此表示的类或接口声明的所有字段类对象。
//        Field[] f = c.getFields();//返回公共
//        Field[] f = c.getDeclaredFields();//返回所有私有的默认的和公共的
//        for (Field field:f){
//            System.out.println(field);
//        }
//        System.out.println("--------");

        // getField(String name) 返回一个 Field对象，它反映此表示的类或接口的指定公共成员字段 类对象。
        //getDeclaredField(String name) 返回一个 Field对象，它反映此表示的类或接口的指定已声明字段 类对象。
        Field addressField = c.getField("address");//拿到了成员变量方法对象

        //获取无参构造方法创建对象
//        Constructor<?> con = c.getConstructor();
//        Object obj = con.newInstance();
//
//        //A Field提供有关类或接口的单个字段的信息和动态访问。 反射的字段可以是类（静态）字段或实例字段。
//        //set(Object obj, Object value) 将指定对象参数上的此 Field对象表示的字段设置为指定的新值。
//        addressField.set(obj,"西安");//给obj的成员变量addressField赋值为西安
//        System.out.println(obj);
//
//        Student s=new Student();
//        s.address = "西安";
//        System.out.println(s);
    }
}
